home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / t_os / catlog / source / malloc.c < prev    next >
C/C++ Source or Header  |  1993-07-08  |  2KB  |  122 lines

  1. /*
  2.     このソースは Snow さん(PFG01172)から送っていただいたものです。
  3.     私(山先)には、著作権がありません。
  4.  
  5.     $Header: MALLOC.Cv  1.2  93/02/12 22:48:28  山先  Exp $
  6. */
  7.  
  8. #include <stdio.h>
  9. #include <string.h>
  10.  
  11. typedef long Align;
  12.  
  13. union header {
  14.     struct {
  15.     union header *ptr;
  16.     unsigned size;
  17.     } s;
  18.     Align x;
  19. };
  20.  
  21. typedef union header Header;
  22.  
  23. #define NALLOC 1024
  24.  
  25. static Header base;
  26. static Header *freep = NULL;
  27.  
  28. static    Header    *morecore(unsigned nu);
  29. void    free(void *ap);
  30.  
  31. void *malloc(unsigned nbytes)
  32. {
  33.     Header *p, *prevp;
  34.     Header *morecore(unsigned);
  35.     unsigned nunits;
  36.  
  37.     nunits = (nbytes+sizeof(Header)-1)/sizeof(Header) + 1;
  38.     if ((prevp = freep) == NULL) {
  39.     base.s.ptr = freep = prevp = &base;
  40.     base.s.size = 0;
  41.     }
  42.     for(p = prevp->s.ptr; ;prevp = p, p = p->s.ptr){
  43.     if(p->s.size >= nunits){
  44.         if(p->s.size == nunits)
  45.         prevp->s.ptr = p->s.ptr;
  46.         else{
  47.         p->s.size -= nunits;
  48.         p += p->s.size;
  49.         p->s.size = nunits;
  50.         }
  51.         freep = prevp;
  52.         return (void *)(p+1);
  53.     }
  54.     if(p == freep)
  55.         if((p = morecore(nunits)) == NULL)
  56.         return NULL;
  57.     }
  58. }
  59.  
  60. static Header *morecore(unsigned nu)
  61. {
  62.     char *cp, *sbrk(int);
  63.     Header *up;
  64.  
  65.     if(nu < NALLOC)
  66.     nu = NALLOC;
  67.     cp = sbrk(nu * sizeof(Header));
  68.     if(cp == (char *)-1)
  69.     return NULL;
  70.     up = (Header *)cp;
  71.     up->s.size = nu;
  72.     free( (void *)(up+1) );
  73.     return freep;
  74. }
  75.  
  76. void free(void *ap)
  77. {
  78.     Header *bp, *p;
  79.  
  80.     if(ap == NULL)
  81.     return;
  82.  
  83.     bp = (Header *)ap - 1;
  84.     for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
  85.     if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
  86.         break;
  87.  
  88.     if(bp + bp->s.size == p->s.ptr) {
  89.     bp->s.size += p->s.ptr->s.size;
  90.     bp->s.ptr = p->s.ptr->s.ptr;
  91.     }
  92.     else
  93.     bp->s.ptr = p->s.ptr;
  94.     if(p + p->s.size == bp){
  95.     p->s.size += bp->s.size;
  96.     p->s.ptr = bp->s.ptr;
  97.     }
  98.     else
  99.     p->s.ptr = bp;
  100.     freep = p;
  101. }
  102.  
  103. void *realloc(void *ptr, size_t size)
  104. {
  105.     void *ptr2;
  106.  
  107.     if(ptr==NULL)
  108.     return malloc(size);
  109.  
  110.     if(size==0){
  111.     free(ptr);
  112.     return NULL;
  113.     }
  114.  
  115.     ptr2=malloc(size);
  116.     if(ptr2==NULL)
  117.     return NULL;
  118.     memcpy(ptr2,ptr,size);
  119.     free(ptr);
  120.     return ptr2;
  121. }
  122.